package com.service.impl;

import com.mapper.*;

import com.pojo.Employee;
import com.pojo.OutApply;
import com.pojo.view.EmpAndOutApply;
import com.service.OutApplyService;
import com.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import java.util.ArrayList;
import java.util.List;

public class OutApplyServiceImpl implements OutApplyService {

    SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();

    /**
     * 将一条outApply记录添加至数据库表tb_outapply
     * @param outApply
     */
    @Override
    public void addToOutApply(OutApply outApply) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        OutApplyMapper mapper = sqlSession.getMapper(OutApplyMapper.class);

        mapper.add(outApply);
        sqlSession.commit();

        sqlSession.close();
    }

    /**
     * 将员工对应的outApply记录添加数据库表tb_emp_outapply
     * @param empAndOutApply
     */
    @Override
    public void addToEmpOutApply(EmpAndOutApply empAndOutApply) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        EmpAndOutApplyMapper mapper = sqlSession.getMapper(EmpAndOutApplyMapper.class);

        mapper.addItem(empAndOutApply);
        sqlSession.commit();

        sqlSession.close();
    }

    /**
     * 根据applytime查找id
     * @param applyTime
     * @return
     */
    @Override
    public int getOutApplyIdByApplyTime(String applyTime) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        OutApplyMapper mapper = sqlSession.getMapper(OutApplyMapper.class);
        OutApply outApply = mapper.getByApplyTime(applyTime);
        int outApplyId = outApply.getId();

        sqlSession.close();
        return outApplyId;
    }

    /**
     * 查找status为“正在审核”的outapply集合
     * @return
     */
    @Override
    public List<OutApply> getOutApplyChecks() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        OutApplyMapper mapper = sqlSession.getMapper(OutApplyMapper.class);
        List<OutApply> outApplyList = mapper.getByStatus("正在审核");

        sqlSession.close();
        return outApplyList;
    }

    /**
     * 根据outapply_id查找对应的员工
     * @return
     */
    @Override
    public Employee getEmployeeByOutApplyId(int outApplyId) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        EmpAndOutApplyMapper empAndOutApplyMapper = sqlSession.getMapper(EmpAndOutApplyMapper.class);
        EmpAndOutApply empAndOutApply = empAndOutApplyMapper.getByOutApplyId(outApplyId);
        String username = empAndOutApply.getUsername();

        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        Employee employee = employeeMapper.getByUsername(username);
        return employee;
    }

    /**
     * 根据outapply_id修改相应申请的status为“已通过”
     * @param outapply_id
     */
    @Override
    public void updateStatusToApprovedById(int outapply_id) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        OutApplyMapper mapper = sqlSession.getMapper(OutApplyMapper.class);
        mapper.updateStatusToApprovedById(outapply_id);

        sqlSession.commit();
        sqlSession.close();
    }

    /**
     * 根据outapply_id查找对应的外出申请
     * @param outApplyId
     * @return
     */
    @Override
    public OutApply getOutApplyByOutApplyId(int outApplyId) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        OutApplyMapper mapper = sqlSession.getMapper(OutApplyMapper.class);
        OutApply outApply = mapper.getById(outApplyId);

        sqlSession.close();
        return outApply;
    }

    /**
     * 根据username查找对应的外出申请Id
     * @param username
     * @return
     */
    @Override
    public List<Integer> getOutApplyIdListByUsername(String username) {
        List<Integer> outApplyIdList = new ArrayList<>();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        EmpAndOutApplyMapper mapper = sqlSession.getMapper(EmpAndOutApplyMapper.class);
        List<EmpAndOutApply> empAndOutApplyList = mapper.getAllByUsername(username);
        for (EmpAndOutApply empAndOutApply : empAndOutApplyList) {
            outApplyIdList.add(empAndOutApply.getOutApplyId());
        }

        sqlSession.close();
        return outApplyIdList;
    }

    /**
     * 查找"正在审核"的申请数目
     * @return
     */
    @Override
    public Integer getWaitToCheckOfAll() {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        OutApplyMapper mapper = sqlSession.getMapper(OutApplyMapper.class);
        List<OutApply> outApplyList = mapper.getWaitToCheck();
        int waitToCheck = outApplyList.size();

        sqlSession.close();
        return waitToCheck;
    }

    /**
     * 根据outapply_id修改相应申请的status为“已通过”
     * @param outApplyId
     */
    @Override
    public void updateStatusToRefusedById(int outApplyId) {
        SqlSession sqlSession = sqlSessionFactory.openSession();
        OutApplyMapper mapper = sqlSession.getMapper(OutApplyMapper.class);
        mapper.updateStatusToRefusedById(outApplyId);

        sqlSession.commit();
        sqlSession.close();
    }
}
